package com.tedu.api.io;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Random;

/**
 * RandomAccessFile
 * 专门解决File无法实现读写操作类【数据传输】，底层使用C完成
 * 【使用方法并不方便】--知道
 * RandomAccessFile构造器使用
 * new RandomAccessFile("文件路径","r代表读,rw代表读写")
 * RandomAccessFile方法的使用：读、写操作
 * 需求：实现音乐  C  V   复制  粘贴
 */
public class RandomAccessFileAPI {
    @Test
    public void testWrite() throws IOException {
        //创建RAF类:在API项目文件夹下创建raf.txt文件   模式：读写操作
        RandomAccessFile raf =
                new RandomAccessFile("raf.txt", "rw");
        /**
         * write()
         * 作用：写出一个字节，将给定的int值对应2进制的"低8位"写出
         * 该方法存在异常，，，范围:0~225之间----写入ASCII码，计算机【接近底层】
         * 出现异常：抛出IO异常---有可能存在文件无法写出的情况
         */
        raf.write(97);        //a
        raf.write(98);        //b
        raf.write(101);
        //关闭  流    close()
        raf.close();
    }

    @Test
    public void testRead() throws IOException {
        //创建RAF类-----模式：r
        RandomAccessFile raf = new RandomAccessFile("raf.txt", "r");
        /**
         * read()
         * 作用：读取一个字节，返回10进制值【int】
         * 如果返回值位-1代表已经读到末尾
         * 抛出IO异常
         */
        int a = raf.read();
        int b = raf.read();
        int e = raf.read();
        int c = raf.read();
        System.out.println("读取到：" + a + " " + b + " " + e + " " + c);
    }

    //需求：实现音乐C V 复制   粘贴
    @Test
    public void testCopy() throws IOException {
        //1.被复制的文件-----复制操作---模式：read
        RandomAccessFile src =
                new RandomAccessFile("复制1.mp4", "r");
        //1.1复制出来的文件---粘贴操作--模式：rw
        RandomAccessFile desc =
                new RandomAccessFile("复制品.mp4", "rw");
        //2.创建一个变量类型：int类型---①用于保存读取/写出的每个字节
        int temp = -1;  //读取：②读到-1代表文件数据读完了
        //5.【一个字节一个字节的读---一个字节一个字节的写】
        long start = System.currentTimeMillis();   //获取系统时间：毫秒数
        //3.从”小跳蛙.mp3“-----读到的每个字节----写出”新跳蛙.mp3“
        //思考：一直从”小跳蛙.mp3“读到所有字节
        //从”小跳蛙.mp3“读到所有字节，只要不是末尾！=-1  一直读
        while ((temp = src.read()) != -1) {//如果有数据：true
            //4.写出【新跳蛙.mp3】每一个字节
            desc.write(temp);     //读入的temp数据写出write当中
        }
        long end = System.currentTimeMillis();  //获取系统时间：毫秒数
        //6.关闭流
        src.close();
        desc.close();
        //7.读取花费时间
        System.out.println("读取花费时间：" + (end - start) + "毫秒数");
    }
//需求：实现视频C V 复制  粘贴

    /**
     * 读写按照1个字节操作----效率低
     * 1024   程序员节
     * 1字节=8位二进制
     * 0    0000 0000
     * 1  0000 0001
     * 2  0000 0010
     * 6  0000 0110
     * 1024字节=1KB
     * 1024KB=1MB
     * 1024MB=1G
     * 1024G=1T
     * 读写按照100KB操作----效率高
     */
    @Test
    public void testRW() throws IOException {
        //1.被复制的文件----视频----占用空间大
        RandomAccessFile src =
                new RandomAccessFile("复制1.mp4", "r");
        //1.1复制的文件---视频.mp4
        RandomAccessFile desc =
                new RandomAccessFile("视频.mp4", "rw");
        //2.保存每次读取的字节量
        int len=-1;
        /**重载
         * read() 一个字节一个字节的读
         * read(字节数组)  实现根据指定的  100KB  方式读取字节
         */
        //3.定义字节数组---100KB
        byte[] date=new byte[1024*100];
        //4.开始从”复制1.mp4“读取
       // (len=src.read(date))!=-1   //判断条件
        while ((len=src.read(date))!=-1){
            /**
             * 重载
             * write(int i)   写出一个字节
             * write(字节数组,读取开始位：0 读取结束：-1)
             * 作用：写出”字节数组：指定大小100KB“的文件，
             *     从0开始，写出到-1结束
             */
            //5.按照100KB  写出“视频.mp4”文件
            desc.write(date,0,len);
            //6.关闭流
            //7.自己测复制时间
        }
    }
}
